import { IPoint } from "../Interfaces/IRole";

/**随机数算法 */
export default class RandomTools {
  /**
   * 从数组中取出指定随机个数数组
   * TIPS:若获数大于数组长度，则全取。
   * @param array
   * @param take 获取条数
   * @param isRmove 是否移除元素
   * @returns 随机数组
   */
  static getRandomToArray<T>(
    array: Array<T>,
    take: number,
    isRmove = false
  ): Array<T> {
    var randomArray = new Array<T>();
    if (take > array.length) {
      randomArray = randomArray.concat(array);
      if (isRmove) {
        array.splice(0);
      }
    } else {
      var maxLength = array.length - 1;
      for (let i = 0; i < take; i++) {
        var randomNumber = Math.round(Math.random() * maxLength);
        randomArray.push(array[randomNumber]);
        if (isRmove) {
          array.splice(randomNumber, 1);
          maxLength--;
        }
      }
    }
    return randomArray;
  }
  /**随机角度 */
  static getRandomAngle(minAngle: number = 0, maxAgnle: number = 360): number {
    return Math.round(Math.random() * (maxAgnle - minAngle)) + minAngle;
  }
  /**随机整数 */
  static getRandomNumber(min: number, max: number = 0): number {
    return Math.round(Math.random() * (max - min)) + min;
  }
  /**随机小数 */
  static getRandomDecimal(min: number, max: number = 0): number {
    return Math.random() * (max - min) + min;
  }
  /**随机硬币投掷 */
  static getRandomCoin(): boolean {
    return Math.round(Math.random() * 9) < 5;
  }
  /**
   * 运气机
   * 通过运气值随机触发是否成功，如设置 0.25 那么随机数小于0.25 则返回true
   * @param chance 概率，默认最高1，
   */
  static getRandomChance(chance: number): boolean {
    return Math.random() < chance;
  }
  /**随机出生点 */
  static getRandomBorn(width: number, height: number): IPoint {
    return { x: Math.random() * width, y: Math.random() * height };
  }
  /**随机出生点-设置边界 */
  static getRandomBornFromBound(
    x: number,
    y: number,
    width: number,
    height: number
  ): IPoint {
    return {
      x: x + Math.random() * (width - x),
      y: y + Math.random() * (height - y),
    };
  }
}
